package com.qf.service.impl;

import com.qf.dao.TbPermissionRepository;
import com.qf.dao.TbRolePermissionMapper;
import com.qf.dao.TbRolePermissionRepository;
import com.qf.dao.TbRoleRepository;
import com.qf.pojo.entity.TbPermission;
import com.qf.pojo.entity.TbRole;
import com.qf.pojo.req.TbRolePermissionReq;
import com.qf.pojo.req.TbRoleReq;
import com.qf.pojo.resp.BasePermissionResp;
import com.qf.pojo.resp.BasePermissionValueResp;
import com.qf.pojo.resp.BaseResp;
import com.qf.service.TbRoleService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
@Service
public class TbRoleServiceImpl implements TbRoleService {
    @Autowired
    TbRoleRepository tbRoleRepository;
    @Autowired
    TbPermissionRepository tbPermissionRepository;
    @Autowired
    TbRolePermissionRepository tbRolePermissionRepository;
    @Autowired
    TbRolePermissionMapper tbRolePermissionMapper;
    /**
     * 查询所有角色
     * @param page 当前页
     * @param size 当前页显示行数
     * @return 响应对象
     */
    @Override
    public BaseResp findAll(Integer page, Integer size) {
        PageRequest of = PageRequest.of(page - 1, size);
        Page<TbRole> all = tbRoleRepository.findAll(of);
        List<TbRole> list = all.getContent();
        long total = all.getTotalPages();
        return new BaseResp(1,"success",list,total);
    }

    /**
     * 修改或新增角色
     * @param tbRoleReq 角色请求对象
     * @return 响应对象
     */
    @Override
    public BaseResp updateOrSave(TbRoleReq tbRoleReq) {
        TbRole tbRole = new TbRole();
        BeanUtils.copyProperties(tbRoleReq,tbRole);
        tbRoleRepository.saveAndFlush(tbRole);
        return new BaseResp().SUCCESS();
    }

    /**
     * 根据角色id删除角色
     * @param id 角色id
     * @return 响应对象
     */
    @Override
    public BaseResp deleteById(Integer id) {
        tbRoleRepository.deleteById(id);
        tbRolePermissionRepository.deleteByRoleId(id);
        return new BaseResp().SUCCESS();
    }

    /**
     * 通过角色id查询与之对应的权限
     * @param id 角色id
     * @return 响应对象
     */
    @Override
    public BaseResp findPermissionByRoleId(Integer id) {
        //1.封装了所有权限的集合
        //1.1查询出数据库中所有权限
        List<TbPermission> all = tbPermissionRepository.findAll();
        //1.2创建权限表将查询出来的权限放入
        List permissionList = new ArrayList<>();
        for (TbPermission list:all) {
            BasePermissionResp basePermissionResp = new BasePermissionResp();
            basePermissionResp.setKey(list.getId());
            basePermissionResp.setLabel(list.getPermissionName());
            basePermissionResp.setDisable(false);
            permissionList.add(basePermissionResp);
        }
        //2.查询该角色所有的权限id
        List<Integer> permissionId = tbRolePermissionRepository.findPermissionIdByRoleId(id);
        //3.将所有权限以及权限编号设置到公共返回值中
        BasePermissionValueResp basePermissionValueResp = new BasePermissionValueResp();
        basePermissionValueResp.setData(permissionList);
        basePermissionValueResp.setValue(permissionId);
        return new BaseResp(1,"success",basePermissionValueResp,null);
    }

    /**
     * 修改角色权限
     * @param tbRolePermissionReq 角色权限请求对对象
     * @return 响应对象
     */
    @Override
    public BaseResp updateRolePermission(TbRolePermissionReq tbRolePermissionReq) {
        //1.获取角色id
        Integer roleid = tbRolePermissionReq.getRoleid();
        //2.获取该角色对应的所有权限id
        List<Integer> permissionList = tbRolePermissionReq.getPermissionList();
        //3.通过权限对应的角色id查询该角色所有的权限
        List<Integer> permissionIdByRoleId = tbRolePermissionRepository.findPermissionIdByRoleId(roleid);
        //4.进行判断
        if (permissionIdByRoleId != null){
            //4.1如果查询出该角色的权限列表不为空,则说明该角色有权限,我们需要将其权限全部删除
            tbRolePermissionMapper.deletePermissionByRoleId(roleid);
        }
        //5.建立新的逻辑,使用动态sql语句,新增权限(foreach的使用)
        if (permissionList != null && permissionList.size()>0){
            tbRolePermissionMapper.addPermissionRole(tbRolePermissionReq);
        }
        return new BaseResp().SUCCESS();
    }
}
